#! /bin/sh
# PCP QA Test No. 151
# check the new behaviour of pmlogger_daily to collect archives
# from longer ago than just yesterday.  Based on qa/532.
#
# Copyright (c) 2004 Silicon Graphics, Inc.  All Rights Reserved.
#
# check-group-include: pmlogextract
#


seq=`basename $0`
echo "QA output created by $seq"

# get standard filters
. ./common.product
. ./common.filter
. ./common.check

# This test is not stable in the vicinity of a timezone change, e.g.
# daylight saving or summer time transitions.
# Don't run if this happened in the last 6 days.
#
now_hr=`pmdate '%H'`
now_hr_6=`pmdate -6d '%H'`
if [ "$now_hr" != "$now_hr_6" ]
then
    _notrun "timezone change? now = ${now_hr}H:??M, 6 days ago = ${now_hr_6}H:??M"
    # NOTREACHED
fi


_filter()
{
    tee -a $seq_full \
    | sed -f $tmp/sed \
    | sed \
	-e '/^Roll .*\/NOTICES/d' \
	-e '/^Start .*\/NOTICES/d' \
	-e '/^Start \[/d' \
	-e '/^End \[/d' \
	-e '/^Add merge callback for: pmlogger_daily_report/d' \
	-e '/^Merge callbacks .../d' \
	-e '/^callback: .*pmlogger_daily_report/d' \
	-e "s;$tmp;TMP;g" \
	-e "s/local:/HOST/g" \
	-e "s/localhost/HOST/g" \
	-e "s/`hostname`/HOST/g" \
	-e "s/`hostname | sed -e 's/\..*//'`/HOST/g" \
	-e '/\/var\/adm\/pcplog\/NOTICES/d' \
	-e 's/-rw-r--r--\./-rw-r--r--/' \
    | $PCP_AWK_PROG '
/-rw-r--r--/	{ print $1,"...",$5,"...",$9; next }
		{ print }' \
    | _filter_cron_scripts
}

NEEDREWRITE=$PCP_LOG_DIR/pmlogger/.NeedRewrite

_cleanup()
{
    cd $here
    $sudo rm -rf $tmp $tmp.*
    [ -f $NEEDREWRITE.$seq ] && $sudo mv $NEEDREWRITE.$seq $NEEDREWRITE
}

status=1	# failure is the default!
trap "cd $here; _cleanup; exit \$status" 0 1 2 3 15

# take explicit control of the umask
#
umask 022

mkdir $tmp
mkdir $tmp/foo

[ -f $NEEDREWRITE ] && $sudo mv $NEEDREWRITE $NEEDREWRITE.$seq

# real QA test starts here

echo >$tmp/sed
# unmerged archives for these days ...
#
for day in 0 1 2 3
do
    for hour in 1 4 16
    do
	[ $day -gt 0 -a $hour -gt 1 ] && continue
	# aiming for the time to be hour:10, hour:20 and hour:30 on
	# each day, even if that is ahead of NOW for today
	#
	now_hr=`pmdate %H`
	hr_set=`expr $hour - $now_hr`
	[ "$hr_set" -ge 0 ] && hr_set="+$hr_set"
	now_min=`pmdate %M`
	min_set10=`expr 10 - $now_min`
	[ "$min_set10" -ge 0 ] && min_set10="+$min_set10"
	min_set20=`expr 20 - $now_min`
	[ "$min_set20" -ge 0 ] && min_set20="+$min_set20"
	min_set30=`expr 30 - $now_min`
	[ "$min_set30" -ge 0 ] && min_set30="+$min_set30"
	namea=`pmdate -${day}d ${hr_set}H ${min_set10}M %Y%m%d.%H.%M`
	nameb=`pmdate -${day}d ${hr_set}H ${min_set20}M %Y%m%d.%H.%M`
	namec=`pmdate -${day}d ${hr_set}H ${min_set30}M %Y%m%d.%H.%M`
	stampa=`echo $namea | sed -e 's/\.//g'`
	stampb=`echo $nameb | sed -e 's/\.//g'`
	stampc=`echo $namec | sed -e 's/\.//g'`
	nameb=${namea}-00
	namec=${namea}-01
	echo "s/$namea/TODAY-$day.${hour}H.MM/g" >>$tmp/sed
	echo "s/$nameb/TODAY-$day.${hour}H.MM-00/g" >>$tmp/sed
	echo "s/$namec/TODAY-$day.${hour}H.MM-01/g" >>$tmp/sed

	for ext in 0 index meta
	do
	    if [ $hour -ne 4 ]
	    then
		cp archives/arch_a.$ext $tmp/$namea.$ext
		touch -t $stampa $tmp/$namea.$ext
	    fi
	    cp archives/arch_b.$ext $tmp/$nameb.$ext
	    touch -t $stampb $tmp/$nameb.$ext
	    cp archives/arch_b.$ext $tmp/$namec.$ext
	    touch -t $stampc $tmp/$namec.$ext
	done
    done
    echo "s/`pmdate -${day}d ${hr_set}H ${min_set10}M %Y%m%d`/TODAY-$day/g" >>$tmp/sed
done

# merged archives for these days ...
#
for day in 4 5 6
do
    # aiming for the time to be 00:10 like when cron does its stuff
    #
    hr_set=-`pmdate %H`
    now_min=`pmdate %M`
    min_set=`expr 10 - $now_min`
    [ "$min_set" -ge 0 ] && min_set="+$min_set"
    namea=`pmdate -${day}d ${hr_set}H ${min_set}M %Y%m%d`
    stampa=`echo $namea | sed -e 's/\.//g'`0010
    echo "s/$namea/TODAY-$day/g" >>$tmp/sed

    for ext in 0 index meta
    do
	cp archives/arch_a.$ext $tmp/$namea.$ext
	touch -t $stampa $tmp/$namea.$ext
    done
    echo "s/$namea/TODAY-$day/g" >>$tmp/sed
done

echo "s/TODAY-0/TODAY/g" >>$tmp/sed
echo "s/`pmdate %Y%m%d`/TODAY/g" >>$tmp/sed

( cd $tmp; tar cf - *.0 *.meta *.index 2>/dev/null ) \
| ( cd $tmp/foo; tar xpf - 2>/dev/null )

echo >$tmp/control '$version=1.1
LOCALHOSTNAME	n   n	'"$tmp"'	./config'

# pmlogger_daily runs as the user "pcp" ... fix ownership
#
find $tmp/* -type f | xargs -r $sudo chown $PCP_USER:$PCP_GROUP
find $tmp/* -type d | xargs -r $sudo chown $PCP_USER:$PCP_GROUP
$sudo chown $PCP_USER:$PCP_GROUP $tmp

echo
echo "Before ..."
ls $tmp | sed -f $tmp/sed | LC_COLLATE=POSIX sort | tee $tmp.before
echo "sed ..." >>$seq_full
cat $tmp/sed >>$seq_full
echo "before ..." >>$seq_full
ls -l $tmp >>$seq_full

# list of culled files is in directory order, hence the cut and sort
# complexity at the end of this pipeline
#
# need to be a place the user $PCP_USER can cd to from pmlogger_daily
#
cd /var/tmp
echo
echo "pmlogger_daily -D -P -k 5 -x never -V ..." >>$seq_full
$sudo -u $PCP_USER -g $PCP_GROUP sh -c "umask 022; $PCP_BINADM_DIR/pmlogger_daily -D -P -c $tmp/control -k 5 -x never -V -l $tmp.log"
$sudo cat $tmp.log \
| _filter \
| $PCP_AWK_PROG '
state == 0		{ print >"'$tmp.out.0'"
			  if ($0 ~ /older than /) state = 1
			  next
			}
state == 1 && $0 ~ /Input archives to be merged:/	{ state = 2 }
state == 1		{ for (i = 1; i <= NF; i++) print $i >"'$tmp.out.1'" }
state == 2		{ print >"'$tmp.out.2'" }'
[ -f $tmp.out.0 ] && cat $tmp.out.0
[ -f $tmp.out.1 ] && LC_COLLATE=POSIX sort $tmp.out.1
[ -f $tmp.out.2 ] && cat $tmp.out.2

echo "out.0 ..." >>$seq_full
[ -f $tmp.out.0 ] && cat $tmp.out.0 >>$seq_full
echo "out.1 ..." >>$seq_full
[ -f $tmp.out.1 ] && cat $tmp.out.1 >>$seq_full

echo
echo "After ..."
ls $tmp | sed -f $tmp/sed | LC_COLLATE=POSIX sort | tee $tmp.after
echo "after ..." >>$seq_full
ls -l $tmp >>$seq_full

echo
echo "Differences ..."
diff $tmp.before $tmp.after

# all done
status=0
exit
